/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.asistencia.DAO;

import com.asistencia.DAO.factory.FactoryDAO;
import com.asistencia.DAO.utils.Connector;
import com.asistencia.DAO.utils.Reloj;
import com.asistencia.model.Funcionario;
import com.asistencia.model.Marcacion;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.swing.JOptionPane;


/**
 *
 * @author rfarias
 */
    public class MarcacionDAO {

      Calendar calendario  = Calendar.getInstance();

      public List findAll(Funcionario fun, String fecha_ini, String fecha_fin) {
        Marcacion mar = null;
        
        ArrayList<Marcacion> listamar = new ArrayList<Marcacion>();
        StringBuilder qry = null;
        qry = new StringBuilder();
        
          qry.append("select * from detalle where rut ='").append(fun.getRut_funcionario()).append("' ");
          if (fecha_ini!=null)
          {
              if(fecha_fin!=null)
              {
                  qry.append("and fecha  between '").append(fecha_ini).append("' and '").append(fecha_fin).append("'");
              }
              else
              {
                  qry.append(" and fecha >= '").append(fecha_ini).append("'");
              }
          }
          else
          {
              System.out.println("ERROR: MarcacionDAO - Method: findAll - Exception : Se requiere el parametro de fecha inicial");
          }
        try{
            ResultSet rs = Connector.getStatement().executeQuery(qry.toString());
            while(rs.next())
            {
                mar = new Marcacion(
                        (Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut")),
                        rs.getDate("fecha"),
                        rs.getTime("entrada")
                        );
                if (rs.getTime("salida")!=null)
                {
                    mar.setH_salida(rs.getTime("salida"));
                }

                listamar.add(mar);
            }
        } catch (Exception ex){
            System.out.println("ERROR: MarcacionDAO - Method: findAll - Exception: " + ex.getMessage()+"\n"+qry.toString());
        } finally {
        return listamar;
        }
    }


        /**
         *
         * @param obj
         * @return
         */

      public boolean update(Object obj) {
        Reloj r = null;
        r = new Reloj();
        
        Funcionario fun = (Funcionario)obj;
        Statement st = Connector.getStatement();
        StringBuilder sb = new StringBuilder();
        sb.append("update detalle set ");
        sb.append ("salida='");     sb.append(r.horaFor());               sb.append("'");
        sb.append (" where rut ='"); sb.append(fun.getRut_funcionario());  sb.append("'");
        sb.append (" and fecha ='"); sb.append(r.fechaDB());              sb.append("'");
        try {
            int res = st.executeUpdate(sb.toString());
            if (res==1)
            {
                return true;
            }
            else
            {
                return false;
            }
        } catch (SQLException ex) {
           System.out.println("ERROR: MarcacionDAO - Method: update - Exception: " + ex.getMessage());
           return false;
        }
    }

    /**
     *
     * @param obj
     * @return mar
     */

    public Object insert(Object obj) {
        Funcionario fun = (Funcionario)obj;
        Reloj r = null;
        r = new Reloj();
        try{
            StringBuilder sb = new StringBuilder();
            sb.append("insert into detalle (rut, fecha, entrada, salida ) values(");
	    sb.append("'");sb.append(fun.getRut_funcionario()); sb.append("',");
            sb.append("'");sb.append(r.fechaDB());              sb.append("',");
            sb.append("'");sb.append(r.horaFor());              sb.append("',");
            sb.append("'");sb.append("00:00:00");               sb.append("')");

            Statement st = Connector.getStatement();
            int res = st.executeUpdate(sb.toString(), Statement.RETURN_GENERATED_KEYS);
            ResultSet rs = st.getGeneratedKeys();
        } catch (Exception ex){
            System.out.println("ERROR: MarcacionDAO - Method: insert - Exception: " + ex.getMessage());
        } finally {
            return fun.getRut_funcionario() != null ? searchMarca(fun.getRut_funcionario()) : null;
        }
    }


      public Object searchMarca(String rut) {
        Marcacion mar = null;
        Funcionario fun = null;
        Reloj r = null;
        r = new Reloj();

        try{
            String qry="select * from detalle where rut = '" + rut + "'" + " and fecha='" + r.fechaDB() + "'";
            ResultSet rs = Connector.getStatement().executeQuery(qry);
            //JOptionPane.showMessageDialog(null, qry);
            if(rs.next())
            {
                fun = (Funcionario) FactoryDAO.getInstance().getDataFun().searchById(rs.getString("rut"));
                mar = new Marcacion( fun, rs.getDate("fecha"), rs.getTime("entrada"));
                SimpleDateFormat sdf =  new SimpleDateFormat("HH:mm:ss");
                //JOptionPane.showMessageDialog(null, rs.getTime("salida").toString());
                if (rs.getTime("salida")!=sdf.parse("00:00:00"))
                {
                    mar.setH_salida(rs.getTime("salida"));
                }
            }
        } catch (Exception ex){
            System.out.println("ERROR: MarcacionDAO - Method: searchMarca - Exception: " + ex.getMessage());
        } finally {

            return mar;
        }
    }


}
